﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using myTutor.Models;
using System.Web.Helpers;

namespace myTutor.Controllers
{
    public partial class ClassController : Controller
    {
        //GET: Class/Register
        public ActionResult Register(bool? anonymous, int? classId, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (classId.HasValue)
            {
                var classSource = Class.GetClassById(classId.Value);
                if (classSource != null)
                {
                    return View(classSource);
                }
            }

            Class model = new Class();
            if (Request.IsAuthenticated && anonymous.Value == false)
            {
                UserMaster user = UserMaster.GetUserByUserName(User.Identity.Name);
                model.Name = user.LastName + " " + user.FirstName;
                model.Gender = user.UserProfile.Gender;
                model.BirthYear = user.UserProfile.DOB.HasValue ? user.UserProfile.DOB.Value.Year.ToString() : null;
                model.MobiPhone = user.UserProfile.MobiPhone;
                model.Email = user.Email;
                model.HouseNumber = user.UserProfile.HouseNumber;
                model.Street = user.UserProfile.Street;
                model.Ward = user.UserProfile.Ward;
                model.ProvinceId = user.UserProfile.ProvinceId;
                model.DistrictId = user.UserProfile.DistrictId;
            }
            return View(model);
        }

        //POST: Class/Register
        [HttpPost]
        public ActionResult Register(Class model, bool? anonymous, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (ModelState.IsValid)
            {
                if (!SpecialityMaster.IsValidSpecialityId(model.ClassRequirement.CustomPupilClassId.Value))
                {
                    ModelState.AddModelError("ClassRequirement.CustomPupilClassId", "Lớp bạn chọn hiện không khả dụng");
                }
                else if (!ProvinceMaster.IsValidProvinceId(model.CustomProvinceId.Value))
                {
                    ModelState.AddModelError("CustomProvinceId", "Tỉnh/Thành phố bạn chọn hiện không khả dụng");
                }
                else if (!DistrictMaster.IsValidDistrictId(model.CustomDistrictId.Value))
                {
                    ModelState.AddModelError("CustomDistrictId", "Huyện/Quận bạn chọn hiện không khả dụng");
                }
                else
                {
                    if (Request.IsAuthenticated && UserMaster.IsInRole(User.Identity.Name, "1") && function == "edit")
                    {
                        Class.UpdateClass(model);
                        return RedirectToAction("ManageClass", "Admin", new { id = model.Id });
                    }
                    if (Request.IsAuthenticated)
                    {
                        model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                        if (UserMaster.IsInRole(User.Identity.Name, "1"))
                        {
                            model.Status = "3";
                            if (anonymous.HasValue && anonymous.Value)
                            {
                                model.AuthorId = null;
                            }
                        }
                        else
                        {
                            model.Status = "2";
                        }
                    }
                    else
                    {
                        model.Status = "2";
                    }
                    Class.RegisterClass(model);
                    if (anonymous.Value)
                    {
                        return RedirectToAction("ApproveClasses", "Admin", new { statusId = "3" });
                    }
                    var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
                    var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/RegisterFindTutorHistory");
                    var linkOnSite = hostUrl + VirtualPathUtility.ToAbsolute("~/Class/Detail/" + model.Id);
                    if (!string.IsNullOrEmpty(model.Email))
                    {
                        try
                        {
                            Config.SetupWebmail();
                            WebMail.Send(
                                to: model.Email,
                                subject: "Đăng ký tìm gia sư thành công - " + Config.GetFullSiteName(),
                                body: "Chúc mừng bạn đã đăng ký tìm gia sư thành công. Mã số tin của bạn là: <b>" + Class.GetMakeUpId(model.Id) + "</b>. Bạn có thể nhấp vào link này để xem lại mẫu tin mình đã đăng được hiển thị trên trang web của hệ hống chúng tôi (Nếu mẫu tin đã được duyệt): " + linkOnSite + ". Hoặc nếu bạn đăng ký bằng tài khoản của hệ thống chúng tôi, bạn có thể xem lại danh sách các mẫu tin mình đã đăng tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm gia sư" + "</a>."
                            );
                            if (!model.AuthorId.HasValue)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi cũng đã gởi một thư thông báo đến email mà bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                            }
                            return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi cũng đã gởi một thư thông báo đến email mà bạn đã cung cấp. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                        }
                        catch
                        {
                            if (!model.AuthorId.HasValue)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo cho bạn được, tuy nhiên nếu có thông tin mới liên quan, chúng tôi sẽ liên hệ lại với bạn theo các thông tin bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                            }
                            return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo như thường lệ cho bạn được, tuy nhiên bạn vẫn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                        }
                    }
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử tìm gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
            }
            return View(model);
        }

        public ActionResult Detail(int id)
        {
            var o = Class.GetClassById(id);
            if (o != null)
            {
                if (o.Status == "3")
                {
                    return View(o);
                }
                return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy lớp có mã số bạn cần do có thể mẫu tin này chưa được duyệt hoặc đã đóng hoặc đã bị xóa vĩnh viễn.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            return RedirectToAction("Error", "Shared");
        }

        public ActionResult HireTutor(int? tutorId, bool? anonymous, int? tranId, string function)
        {
            var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
            var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/HireTutorHistory");

            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            if (tranId.HasValue)
            {
                ClassTutorTransaction tran = ClassTutorTransaction.GetTransactionById(tranId.Value);
                if (tran != null && tran.ClassFindingId.HasValue)
                {
                    return View(tran);
                }
                return RedirectToAction("Error", "Shared");
            }

            if (tutorId.HasValue)
            {
                if (TutorClassFindingRequest.IsValidTutorId(tutorId.Value))
                {
                    ClassTutorTransaction model = new ClassTutorTransaction();
                    model.ClassFindingId = tutorId;

                    if (Request.IsAuthenticated)
                    {
                        model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                        if (UserMaster.IsInRole(User.Identity.Name, "1"))
                        {
                            if (anonymous.Value)
                            {
                                model.AuthorId = null;
                            }
                        }
                        if (model.AuthorId.HasValue)
                        {
                            if (model.AuthorId == TutorClassFindingRequest.GetTutorClassFindingRequestById(tutorId.Value).AuthorId)
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Bạn không được thuê gia sư do chính bạn đăng", message = "Gia sư mà bạn vừa yêu cầu đăng ký nhận thuê là do chính bạn đã đăng, xin vui lòng xem lại hoặc chọn thuê gia sư khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
                            }
                            if (!TutorClassFindingRequest.IsGetable(model.AuthorId.Value, model.ClassFindingId.Value))
                            {
                                return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận gia sư này rồi", message = "Bạn đã nhận gia sư này rồi và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang lịch sử nhận gia sư", returnUrl = "/Account/HireTutorHistory" });
                            }
                        }
                        if (!anonymous.Value)
                        {
                            UserMaster user = UserMaster.GetUserByUserName(User.Identity.Name);
                            model.ParentsName = user.LastName + " " + user.FirstName;
                            model.ParentsGender = user.UserProfile.Gender;
                            model.ParentsBirthYear = user.UserProfile.DOB.HasValue ? user.UserProfile.DOB.Value.Year.ToString() : null;
                            model.ParentsMobiPhone = user.UserProfile.MobiPhone;
                            model.ParentsEmail = user.Email;
                            model.ParentsHouseNumber = user.UserProfile.HouseNumber;
                            model.ParentsStreet = user.UserProfile.Street;
                            model.ParentsWard = user.UserProfile.Ward;
                            model.ParentsProvinceId = user.UserProfile.ProvinceId;
                            model.ParentsDistrictId = user.UserProfile.DistrictId;
                        }
                    }
                    return View(model);
                }
            }
            return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy thông tin mà bạn yêu cầu.", returnPage = "Trang chủ", returnUrl = "/" });
        }

        [HttpPost]
        public ActionResult HireTutor(ClassTutorTransaction model, bool? anonymous, string function)
        {
            anonymous = anonymous ?? false;
            ViewBag.Anonymous = anonymous;
            ViewBag.Function = function;

            var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
            var linkProfile = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/HireTutorHistory");

            if (!TutorClassFindingRequest.IsValidTutorId(model.ClassFindingId.Value))
            {
                return RedirectToAction("Info", "Shared", new { title = "Không tìm thấy dữ liệu", message = "Rất tiếc chúng tôi không tìm thấy thông tin mà bạn yêu cầu.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (string.IsNullOrEmpty(model.CustomParentsName) ||
                string.IsNullOrEmpty(model.CustomParentsGender) ||
                string.IsNullOrEmpty(model.CustomParentsBirthYear) ||
                string.IsNullOrEmpty(model.CustomParentsMobiPhone) ||
                string.IsNullOrEmpty(model.CustomParentsHouseNumber) ||
                string.IsNullOrEmpty(model.CustomParentsStreet) ||
                string.IsNullOrEmpty(model.CustomParentsWard) ||
                !model.CustomParentsProvinceId.HasValue ||
                !model.CustomParentsDistrictId.HasValue)
            {
                return View(model);
            }

            if (Request.IsAuthenticated && UserMaster.IsInRole(User.Identity.Name, "1") && function == "edit")
            {
                ClassTutorTransaction.UpdateTransaction(model);
                return RedirectToAction("ManageTutor", "Admin", new { id = model.ClassFindingId });
            }

            if (Request.IsAuthenticated)
            {
                model.AuthorId = UserMaster.GetUserByUserName(User.Identity.Name).Id;
                if (UserMaster.IsInRole(User.Identity.Name, "1"))
                {
                    model.Status = "3";
                    if (anonymous.HasValue && anonymous.Value)
                    {
                        model.AuthorId = null;
                    }
                }
                else
                {
                    model.Status = "2";
                }
                if (model.AuthorId.HasValue && !TutorClassFindingRequest.IsGetable(model.AuthorId.Value, model.ClassFindingId.Value))
                {
                    return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận gia sư này rồi", message = "Bạn đã nhận gia sư này rồi và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang lịch sử nhận gia sư", returnUrl = "/Account/HireTutorHistory" });
                }
            }
            else
            {
                model.Status = "2";
            }
            if (model.AuthorId == TutorClassFindingRequest.GetTutorClassFindingRequestById(model.ClassFindingId.Value).AuthorId)
            {
                return RedirectToAction("Info", "Shared", new { title = "Bạn không được thuê gia sư do chính bạn đăng", message = "Gia sư mà bạn vừa yêu cầu đăng ký nhận thuê là do chính bạn đã đăng, xin vui lòng xem lại hoặc chọn thuê gia sư khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (model.ParentsMobiPhone == TutorClassFindingRequest.GetTutorClassFindingRequestById(model.ClassFindingId.Value).MobiPhone)
            {
                return RedirectToAction("Info", "Shared", new { title = "Có thể bạn đang thuê gia sư do chính bạn đăng", message = "Số điện thoại bạn cung cấp trùng với số điện thoại của gia sư mà bạn vừa yêu cầu đăng ký nhận thuê, xin vui lòng xem lại hoặc chọn thuê gia sư khác. Xin chân thành cảm ơn!", returnPage = "Trang chủ", returnUrl = "/" });
            }
            if (!TutorClassFindingRequest.IsGetable(model.ParentsMobiPhone, model.ClassFindingId.Value))
            {
                if (!model.AuthorId.HasValue)
                {
                    return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận gia sư này rồi", message = "Bạn đã nhận gia sư này rồi và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong email thông báo chúng tôi đã gởi cho bạn mỗi khi bạn đăng ký nhận gia sư.", returnPage = "Trang chủ", returnUrl = "/" });
                }
                return RedirectToAction("Info", "Shared", new { title = "Bạn đã nhận gia sư này rồi", message = "Bạn đã nhận gia sư này rồi và thông tin vẫn đang được xem xét, chính vì thế bạn không cần phải đăng ký thêm nữa, vui lòng kiểm tra lại trong mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang lịch sử nhận gia sư", returnUrl = "/Account/HireTutorHistory" });
            }
            ClassTutorTransaction.AddTransaction(model);
            if (anonymous.Value)
            {
                return RedirectToAction("ManageClass", "Admin", new { id = model.ClassId.Value });
            }
            if (!string.IsNullOrEmpty(model.ParentsEmail))
            {
                var linkClassDetail = hostUrl + VirtualPathUtility.ToAbsolute("~/Tutor/Detail/" + model.ClassFindingId);
                try
                {
                    Config.SetupWebmail();
                    WebMail.Send(
                        to: model.ParentsEmail,
                        subject: "Đăng ký nhận gia sư thành công - " + Config.GetFullSiteName(),
                        body: "Chúc mừng bạn đã đăng ký nhận gia sư thành công. Mã số gia sư bạn vừa nhận là <a href=\"" + linkClassDetail + "\" title=\"Nhấp vào đây để xem chi tiết gia sư.\"><b>" + TutorClassFindingRequest.GetMakeUpId(model.ClassFindingId.Value) + "</b></a>. Mã số giao dịch của bạn là: <b>" + model.GetMakeUpId + "</b>. Nếu bạn đăng ký nhận gia sư bằng tài khoản của hệ thống chúng tôi, bạn có thể xem lại danh sách các gia sư mình đã đăng ký nhận tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>."
                    );
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi đã đã gởi một email thông báo vào hộp thư mà bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Chúng tôi đã đã gởi một email thông báo vào hộp thư mà bạn đã cung cấp. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
                catch
                {
                    if (!model.AuthorId.HasValue)
                    {
                        return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo cho bạn được, tuy nhiên nếu có thông tin mới liên quan, chúng tôi sẽ liên hệ lại với bạn theo các thông tin bạn đã cung cấp.", returnPage = "Trang chủ", returnUrl = "/" });
                    }
                    return RedirectToAction("Info", "Shared", new { title = "Thông tin đã được ghi nhận", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Do có sự cố kỹ thuật nên hiện tại chúng tôi không thể gởi email thông báo như thường lệ cho bạn được, tuy nhiên bạn vẫn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
                }
            }
            if (!model.AuthorId.HasValue)
            {
                return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống.", returnPage = "Trang chủ", returnUrl = "/" });
            }
            return RedirectToAction("Info", "Shared", new { title = "Đăng ký thành công", message = "Thông tin đăng ký của bạn đã được lưu vào hệ thống. Bạn có thể xem lại thông tin này tại mục <a href=\"" + linkProfile + "\">" + "Lịch sử nhận gia sư" + "</a>.", returnPage = "Trang chủ", returnUrl = "/" });
        }
    }
}